package com.aaa.Implements;

import cn.dev33.satoken.model.wrapperInfo.SaDisableWrapperInfo;
import cn.dev33.satoken.stp.StpInterface;
import com.aaa.service.SaPermissionService;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 实现 SaToken 的权限认证接口
 * : 提供当前用户的权限/角色数据，以及账号封禁检查
 * @ 获取用户的信息进行登录认证 / 在调用需要检查权限的方法时进行调用其中的类方法以进行检查权限 确保权限的准确性（这里再执行需要权限的方法时会调用方法以确定权限的使用前更新 更安全）
 */
@Component
public class StpInterfaceImpl implements StpInterface {

    // 这里主要用来引入 能够获取用户权限的服务类 类似于serviceImpl（service）
    private SaPermissionService saPermissionService;
    /**
     * 获取指定用户的权限码列表
     * @ 获取指定用户的权限列表
     * @param loginId 用户ID
     * @param loginType 账号体系类型 多账号使用
     * @return 权限码列表 ["user:add", "user:delete"]
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        System.out.println("---获取指定用户的权限列表---");

        List<String> userPermissions = saPermissionService.queryUserPermissions(loginId);

//        List<String> permissionList = new ArrayList<String>();
//        permissionList.add("user.add");
//        permissionList.add("user.select");
        System.out.println(userPermissions);
        return userPermissions;
    }

    /**
     * 获取指定用户的角色标识列表
     *
     * @param loginId 用户ID
     * @param loginType 账号体系类型
     * @return 角色标识列表（如：["admin", "editor"]）
     *
     * @implNote 角色标识通常需要添加前缀（如："ROLE_"）取决于你的权限设计规范
     * &#064;security  角色数据应进行缓存优化，避免频繁查询数据库
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        System.out.println("---获取指定用户的角色标识列表---");
        List<String> userRoles = saPermissionService.queryUserRoles(loginId);
//        List<String> roleList = new ArrayList<>();
//        roleList.add("vip");
        System.out.println(userRoles);
        return userRoles;
    }

    /**
     * 检查指定账号是否被封禁
     *
     * @param loginId 用户ID
     * @param service 服务标识（可用于细分封禁场景）
     * @return 封禁信息包装对象：
     *         - 若返回null表示账号正常
     *         - 若返回SaDisableWrapperInfo对象则表示账号被封禁
     *
     * @apiNote 此方法为Sa-Token 1.31.0+新增功能
     * @scenario 典型应用场景：
     *           1. 临时封禁违规用户
     *           2. 限制特定服务的使用权限
     */
    @Override
    public SaDisableWrapperInfo isDisabled(Object loginId, String service) {
        System.out.println("---检查指定账号是否被封禁---");
        return StpInterface.super.isDisabled(loginId, service);
    }
}
